package cn.itcast.test;


import cn.itcast.dao.RoleDao;
import cn.itcast.dao.UserDao;
import cn.itcast.domain.Role;
import cn.itcast.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

/*多对多关系  测试*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class ManyTOManytest {

    @Autowired
    private UserDao userDao;
    @Autowired
    private RoleDao roleDao;


    @Test
    @Transactional
    @Rollback(false) //不回滚
    public void test1(){
        Role role = new Role();
        role.setRoleName("java程序员");

        Role role1 = new Role();
        role1.setRoleName("工程师");
        roleDao.save(role1);

        Role role2 = new Role();
        role2.setRoleName("技术员");
        roleDao.save(role2);



        User user = new User();
        user.setUserName("小明");

        user.getRoles().add(role);//配置用户到角色关系
        role.getUsers().add(user);

        //user表里如果设置 级联操作   下面直接执行第一句 级可以了   会自动保存role
        userDao.save(user);
        roleDao.save(role);



        User user1 = new User();
        user1.setUserName("鲁大师");

        user1.getRoles().add(role1);//配置用户到角色关系
        role1.getUsers().add(user1);

        //user表里如果设置 级联操作   下面直接执行第一句 级可以了   会自动保存role
        userDao.save(user1);
        roleDao.save(role1);

    }


    @Test
    @Transactional
    @Rollback(false) //不回滚
    public void test2(){
        Role one = roleDao.findOne(1l);
        System.out.println(one.getUsers());
    }



    @Test
    @Transactional                     //不写这个会报懒加载错误
    @Rollback(false) //不回滚
    public void test3(){
        User one = userDao.findOne(1l);

        //hibernate多对多关系中  java.lang.StackOverflowError
        //注意 实体类中  toString方法不要写关联对象  相互递归太深出错
        System.out.println(one.getRoles());
    }


    @Test
    @Transactional                     //不写这个会报懒加载错误
    @Rollback(false) //不回滚
    public void test4(){
        User user = userDao.findOne(1l);
        userDao.delete(user);

        //hibernate多对多关系中  java.lang.StackOverflowError
        //注意 实体类中  toString方法不要写关联对象  相互递归太深出错

    }
}
